package test4.B1;
import java.time.LocalTime;

// 定义水箱的各种状态
enum State {
    IDLE,          // 空闲状态
    HEATING,       // 加热状态
    OUT_OF_WATER,  // 缺水状态
    BROKEN,        // 损坏状态
    MAINTENANCE,   // 维修状态
    SLEEP          // 休眠状态
}

class WaterTank {
    private State currentState;   // 当前状态
    private double temperature;    // 当前水温
    private boolean hasWater;      // 水箱是否有水
    private boolean isBroken;      // 水箱是否损坏
    LocalTime currentTime; // 当前时间

    // 构造方法，初始化水箱的状态和初始参数
    public WaterTank() {
        this.currentState = State.IDLE;
        this.temperature = 20.0;
        this.hasWater = true;
        this.isBroken = false;
        this.currentTime = LocalTime.now();
    }

    // 更新水箱状态的方法，根据当前状态和条件判断下一步操作
    public void updateState() {
        currentTime = LocalTime.now(); // 更新当前时间
        switch (currentState) {
            case IDLE:
                // 空闲状态的条件判断
                if (currentTime.getHour() == 23 && currentTime.getMinute() == 0) {
                    currentState = State.SLEEP; // 11点进入休眠状态
                } else if (temperature < 20.0) {
                    if (hasWater) {
                        currentState = State.HEATING; // 如果低于20°并且有水，进入加热状态
                    } else {
                        currentState = State.OUT_OF_WATER; // 如果缺水，进入缺水状态
                    }
                }
                break;

            case HEATING:
                // 加热状态的条件判断
                if (temperature >= 100.0) {
                    currentState = State.IDLE; // 达到100°停止加热，进入空闲状态
                } else {
                    temperature += 5.0; // 模拟加热过程，温度每次增加5°
                    if (isBroken) {
                        currentState = State.BROKEN; // 如果水箱损坏，进入损坏状态
                    }
                }
                break;

            case OUT_OF_WATER:
                // 缺水状态，如果补水则返回空闲状态
                if (hasWater) {
                    currentState = State.IDLE;
                }
                break;

            case BROKEN:
                // 损坏状态进入维修状态
                currentState = State.MAINTENANCE;
                break;

            case MAINTENANCE:
                // 维修状态，如果修好则返回空闲状态
                if (!isBroken) {
                    currentState = State.IDLE;
                }
                break;

            case SLEEP:
                // 休眠状态，如果到达早上7点则恢复正常工作
                if (currentTime.getHour() == 7 && currentTime.getMinute() == 0) {
                    currentState = State.IDLE;
                }
                break;
        }
    }

    // 以下方法模拟外部因素的变化
    public void addWater() {
        hasWater = true;
    }

    public void removeWater() {
        hasWater = false;
    }

    public void breakTank() {
        isBroken = true;
    }

    public void repairTank() {
        isBroken = false;
    }

    // 获取当前温度
    public double getTemperature() {
        return temperature;
    }

    // 获取当前状态
    public State getCurrentState() {
        return currentState;
    }

    // 打印当前水箱的状态信息
    public void printStatus() {
        System.out.println("当前时间: " + currentTime);
        System.out.println("当前状态: " + currentState);
        System.out.println("当前温度: " + temperature);
        System.out.println("是否有水: " + hasWater);
        System.out.println("是否损坏: " + isBroken);
        System.out.println();
    }
}

public class WaterTankSimulator {
    public static void main(String[] args) {
        WaterTank waterTank = new WaterTank();

        // 模拟一天的状态变化
        for (int i = 0; i < 1440; i++) { // 一天有1440分钟
            waterTank.updateState(); // 更新水箱状态
            waterTank.printStatus(); // 输出当前状态信息

            // 模拟一分钟的时间间隔
            try {
                Thread.sleep(100); // 休眠100毫秒以模拟时间流逝（用于演示）
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 模拟外部条件的变化
            if (i == 300) { // 在某一时刻，移除水箱中的水
                waterTank.removeWater();
            } else if (i == 400) { // 在稍后时间，加回水
                waterTank.addWater();
            } else if (i == 600) { // 再稍后时间，模拟水箱损坏
                waterTank.breakTank();
            } else if (i == 700) { // 修复水箱
                waterTank.repairTank();
            }

            // 手动前进时间用于演示
            waterTank.currentTime = waterTank.currentTime.plusMinutes(1);
        }
    }
}
